home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / BLAKJACK.PAK / OWLMAIN.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  21KB  |  781 lines

  1. //-----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1995 by Borland International
  3. // Owlmain.cpp contains the GUI interface for the blackjack game.
  4. //-----------------------------------------------------------------------------
  5. #include <owl/pch.h>
  6. #include <owl/module.h>
  7. #include <owl/edit.h>
  8. #include <owl/static.h>
  9. #include <owl/button.h>
  10. #include <owl/validate.h>
  11. #include <owl/inputdia.h>
  12. #include <stdlib.h>
  13. #include "blakjack.h"
  14.  
  15. #include "mhcd2001.h"
  16. #include "owlmain.h"
  17. #include "card.rh"
  18.  
  19. const char AppName[] = "Blackjack";
  20. const int  TBlackjack::TextLen = 5; // text length.
  21.  
  22. DEFINE_RESPONSE_TABLE1(TBlackjack, TDialog)
  23.   EV_COMMAND  (ID_STAND_BTN,    IdStandBtn)   ,
  24.   EV_COMMAND  (ID_HIT_BTN,      IdHitBtn)     ,
  25.   EV_COMMAND  (ID_BANKROLL_BTN, IdBankrollBtn),
  26.   EV_COMMAND  (ID_BET_BTN,      IdBetBtn)     ,
  27.   EV_EN_CHANGE(ID_DISP_BANKROLL_INPUT, CheckBankRollInput),
  28.   EV_EN_CHANGE(ID_DISP_BET_INPUT, CheckBetInput),
  29. END_RESPONSE_TABLE;
  30.  
  31. TBlackjack::TBlackjack(TWindow *pWin)
  32. :
  33.   TWindow(pWin),
  34.   TDialog(pWin, AppName),
  35.   Brush(TColor(0, 0, 0))
  36. {
  37.   strcpy(prevBet, "100");
  38.   strcpy(prevBankroll, "1000");
  39.  
  40.   // You must new these card objects here.
  41.  
  42.   VBXCardCount = 0;
  43.  
  44.   // The order of "new"-ing the VBX cards is important, other wise
  45.   // the clipping order will become wrong. You do not want the first
  46.   // card which was dealt, to be sitting on top of all other cards, which
  47.   // were dealt later.
  48.  
  49.   for (int l=51; l >= 0; l--) {
  50.      // All the card goes on the deck.
  51.      // This is placed on the Dealer side.
  52.      ppVBXCard[l] = new TVbxMhCardDeck(this,
  53.                                   500-l,
  54.                                   "VbControl",
  55.                                   DEALER_VBX_CARD1_X,
  56.                                   DEALER_VBX_CARD1_Y,
  57.                                   VBX_CARD_WIDTH,
  58.                                   VBX_CARD_LENGTH);
  59.      ppVBXCard[l]->SetPropVisible(FALSE);
  60.   }
  61.  
  62.   // Following objects are for the buttons.
  63.   pHitBtn      = new TButton(this, ID_HIT_BTN)       ;
  64.   pBankrollBtn = new TButton(this, ID_BANKROLL_BTN)  ;
  65.   pStandBtn    = new TButton(this, ID_STAND_BTN)     ;
  66.   pBetBtn      = new TButton(this, ID_BET_BTN)       ;
  67.  
  68.   // The following objects are used to display scores
  69.   pIdDispBankroll1 = new TStatic(this, ID_DISP_BANKROLL1); // Bankroll
  70.   pIdDispBet       = new TStatic(this, ID_DISP_BET)      ; // Bet
  71.   pIdDispPPoints   = new TStatic(this, ID_DISP_PPOINTS)  ; // Player points.
  72.   pIdDispDPoints   = new TStatic(this, ID_DISP_DPOINTS)  ; // Dealer points.
  73.  
  74.   // pointer to Edit field used to Input Bankroll amount.
  75.   pEInputBankRoll  = new TEdit(this, ID_DISP_BANKROLL_INPUT, TBlackjack::TextLen);
  76.   pEInputBet       = new TEdit(this, ID_DISP_BET_INPUT,      TBlackjack::TextLen);
  77.  
  78.   // pointer to validater which validates Input Bankroll field.
  79.   pValidBankRoll   = new TFilterValidator("0-9");
  80.   pValidBet        = new TFilterValidator("0-9");
  81.  
  82.   pEInputBankRoll->SetValidator(pValidBankRoll);
  83.   pEInputBet->SetValidator(pValidBet);
  84.  
  85.   pEInputBankRoll->ShowWindow(SW_HIDE);
  86.   pEInputBet->ShowWindow(SW_HIDE);
  87. }
  88.  
  89. TBlackjack::~TBlackjack()
  90. {
  91.   for (int l=0; l < 52; l++)
  92.     delete ppVBXCard[l];
  93.  
  94.   delete pEInputBankRoll;
  95.   delete pEInputBet;
  96.  
  97. // delete pValidBankRoll;
  98. // delete pValidBet;
  99.  
  100.   delete pHitBtn;
  101.   delete pBankrollBtn;
  102.   delete pStandBtn;
  103.   delete pBetBtn;
  104.  
  105.   delete pIdDispBankroll1;
  106.   delete pIdDispBet;
  107.   delete pIdDispPPoints;
  108.   delete pIdDispDPoints;
  109. }
  110.  
  111. void
  112. TBlackjack::SetupWindow()
  113. {
  114.   TDialog::SetupWindow();
  115.   // Center the dialog.
  116.   int x = ::GetSystemMetrics(SM_CXSCREEN);
  117.   int y = ::GetSystemMetrics(SM_CYSCREEN);
  118.   MoveWindow(
  119.       (x/2 - GetWindowRect().Width()/2),
  120.       (y < GetWindowRect().Height() ? 0: (y-GetWindowRect().Height())/2),
  121.       GetWindowRect().Width(), GetWindowRect().Height()
  122.     );
  123.  
  124.   // Enables the buttons in the dialog.
  125.   InitBlackjack();
  126.   DisplayCardOnTable();
  127. }
  128.  
  129. bool
  130. TBlackjack::EvInitDialog(HWND hWnd)
  131. {
  132.   return TDialog::EvInitDialog(hWnd);
  133. }
  134.  
  135. void
  136. TBlackjack::InitBlackjack()
  137. {
  138.   pBankrollBtn->EnableWindow(TRUE);
  139.   pHitBtn->EnableWindow(FALSE);
  140.   pStandBtn->EnableWindow(FALSE);
  141.   pBetBtn->EnableWindow(FALSE);
  142. }
  143.  
  144. void
  145. TBlackjack::DisplayCardOnTable()
  146. {
  147.   int k = 5;
  148.   int i = 0;
  149.  
  150.   // Display card on dealer's part of the table
  151.   //
  152.   for (; i < 9; i++,k++)
  153.   {
  154.      ppVBXCard[i]->SetPropLeft(DEALER_VBX_CARD1_X+ (i*VBX_CARD_WIDTH*10));
  155.      ppVBXCard[i]->SetPropTop (DEALER_VBX_CARD1_Y);
  156.  
  157.      ppVBXCard[i]->SetPropSuit(ENUM(i%4));
  158.      ppVBXCard[i]->SetPropValue(ENUM(k%52));
  159.  
  160.      ppVBXCard[i]->SetPropVisible(TRUE);
  161.   }
  162.  
  163.   // Display cards on player's part of the table
  164.   //
  165.   int p = 0;
  166.   for (k =13, i=10; i < 19; i++, k--, p++) {
  167.      ppVBXCard[i]->SetPropLeft(PLAYER_VBX_CARD1_X + p*VBX_CARD_WIDTH*10);
  168.      ppVBXCard[i]->SetPropTop(PLAYER_VBX_CARD1_Y);
  169.      if ((13-k) % 2) {
  170.        ppVBXCard[i]->SetPropSuit(ENUM((13-k)%4));
  171.        ppVBXCard[i]->SetPropValue(ENUM(k%52));
  172.      }
  173.      else {
  174.        ppVBXCard[i]->SetPropCardBack(TVbxMhCardDeck::CardBack_10_Castle);
  175.      }
  176.      ppVBXCard[i]->SetPropVisible(TRUE);
  177.   }
  178. }
  179.  
  180. void
  181. TBlackjack::RemoveAllCardsOnTable()
  182. {
  183.   for (int i=0; i < 52; i++)
  184.     ppVBXCard[i]->SetPropVisible(FALSE);
  185. }
  186.  
  187. //
  188. // This is the callback function for the "BANKROLL" button.
  189. //
  190. void
  191. TBlackjack::IdBankrollBtn()
  192. {
  193.   BankRollEnteredFirstTime = 1;
  194.  
  195.   // Enable the input field for bankroll
  196.   pEInputBankRoll->ShowWindow(SW_SHOWNORMAL);
  197.   pEInputBankRoll->Clear();
  198.   pEInputBankRoll->Insert(prevBankroll);
  199.   pEInputBankRoll->SetSelection(0,4);
  200.  
  201.   pBetBtn->SetFocus();
  202.   // Enables "return" key to work on the "Bet" button.
  203.   SetDefaultId(pBetBtn->GetId());
  204. }
  205.  
  206. //
  207. // This is the callback function for the "BET"/"PLAY" button.
  208. //
  209. void
  210. TBlackjack::IdBetBtn()
  211. {
  212.   char btnText[10];
  213.   pBetBtn->GetWindowText(btnText,8); // It migth be "&Bet" or "Pla&y"
  214.  
  215.   if (strcmp("&Bet", btnText) == 0)
  216.     ProcessBetButton();
  217.   else
  218.     ProcessPlayButton();
  219. }
  220.  
  221. //
  222. // When "Bet" button is hit, this function is called.
  223. // The "Bet" button can be clicked under 2 different conditions.
  224. // 1) When a new bankroll amount is entered and
  225. // 2) When a game is finished.
  226. // For case one, the input bankroll amount must be more than 0, then only
  227. // the bet button is activated.
  228. // When the player hits the bet button he is allowed to enter a bet
  229. // amount in the bet input field.
  230. // "Bet" button is toggled to "Play" button.
  231. // By default, the previous bet amount is displayed in the "Bet" input field.
  232. // If the previous bet amount is more than the current bankroll amount,
  233. // it is made equal to bankroll amount and displayed.
  234. //
  235. void
  236. TBlackjack::ProcessBetButton()
  237. {
  238.   char str[TBlackjack::TextLen+6];
  239.   int currBankroll;
  240.   int bankrollMoreThanZero;
  241.  
  242.   if (BankRollEnteredFirstTime) {
  243.     // When new bankroll is entered, it is read from
  244.     // the input field.
  245.     //
  246.     pEInputBankRoll->GetLine(str, TBlackjack::TextLen, 0);
  247.     currBankroll = atoi(str);
  248.  
  249.     if (!currBankroll) {
  250.       bankrollMoreThanZero = 0;
  251.       currBankroll = 0;
  252.       strcpy(str, "You are Bankrupt!");
  253.       pIdDispBet->SetText(str);
  254.     }
  255.     else {
  256.       bankrollMoreThanZero = 1;
  257.       strcpy(prevBankroll, str);
  258.       BankRollEnteredFirstTime = 0;
  259.       bj.getPlayer(1)->getPocket().setTotal(currBankroll);
  260.     }
  261.   }
  262.   else {
  263.     bankrollMoreThanZero = 1;
  264.     currBankroll = bj.getPlayer(1)->getPocket().getTotal();
  265.     itoa(currBankroll, str, 10);
  266.   }
  267.   if (bankrollMoreThanZero) {
  268.     // When bankroll amount is more than 0.
  269.     // Make bet button to play button
  270.     //
  271.     pBetBtn->SetWindowText("Pla&y");
  272.  
  273.     // Clear and activate the Input bet field
  274.     //
  275.     pEInputBet->ShowWindow(SW_SHOWNORMAL);
  276.     pEInputBet->Clear();
  277.  
  278.     // Set focus on play(bet) button
  279.     //
  280.     pBetBtn->SetFocus();
  281.  
  282.     // Enables "return" key to work on the "Bet" button.
  283.     //
  284.     SetDefaultId(pBetBtn->GetId());
  285.  
  286.     // Disable the Bankroll Edit field and Button.
  287.     //
  288.     pEInputBankRoll->ShowWindow(SW_HIDE);
  289.     ::EnableWindow(GetDlgItem(ID_BANKROLL_BTN), FALSE);
  290.  
  291.     // Display the new/changed bankroll
  292.     //
  293.     pIdDispBankroll1->SetText(str);
  294.  
  295.     // If bet is more than bankroll amount, make the bet
  296.     // equal to bankroll, else use the prev bet amount.
  297.     //
  298.     if (atoi(prevBet) > currBankroll) {
  299.       char currBankrollStr[10];
  300.       itoa(currBankroll, currBankrollStr, 10);
  301.       pEInputBet->Insert(currBankrollStr);
  302.     }
  303.     else
  304.       pEInputBet->Insert(prevBet);
  305.   }
  306. }
  307.  
  308. //
  309. // When the play button is hit this funtion is called.
  310. // "Play" button is toggled to "Bet" button.
  311. // If the deck has less than 26 cards, a new deck is introduced.
  312. // The Old cards are removed from the table
  313. // The input bet amount is captured form the input bet field.
  314. // If the "Bet" amount is more than Bankroll
  315. // amount or 0, a warning is issued, otherwise for a valid bet, the "Hit" and
  316. // "Stand" buttons are enabled but all the other buttons are disabled.
  317. // Since this is a new game, the dealer and the player gets
  318. // 2 cards each. Both the players cards are displayed but
  319. // for the dealer, only one card is displayed.
  320. // If any of the players score 21(with 2 cards), he  wins(Blackjack).
  321. //
  322. void
  323. TBlackjack::ProcessPlayButton()
  324. {
  325.   char buf[TextLen+1] = "\0";
  326.   int money = (bj.getPlayer(1))->getPocket().getTotal();
  327.  
  328.  
  329.   // Check if the total card count on the deck is less than equal
  330.   // to 26, if it is, start with a new deck of cards.
  331.  
  332.   if (bj.getDealer().getDeck().GetTotal() < 26)
  333.   {
  334.     strcpy(buf, "New Deck");
  335.     pIdDispBet->SetText(buf);
  336.     VBXCardCount = 0;
  337.     delete (&bj.getDealer().getDeck());
  338.     bj.getDealer().setDeck(new Deck);
  339.   }
  340.  
  341.   RemoveAllCardsOnTable();
  342.  
  343.   // Get the input bet amount
  344.   pEInputBet->GetLine(buf, TBlackjack::TextLen, 0);
  345.   int betMoney = atoi(buf);
  346.   strcpy(prevBet, buf);
  347.  
  348.   // Disable the Bet input
  349.   pEInputBet->ShowWindow(SW_HIDE);
  350.  
  351.   // Toggle "Play" button to "Bet" button.
  352.   pBetBtn->SetWindowText("&Bet");
  353.  
  354.   if (!(bj.getPlayer(1))->Bet(betMoney)) {
  355.     //if bet Money > bankroll amount, or 0.
  356.     //
  357.     strcpy(buf, "Bet > bankroll or 0");
  358.     pIdDispBet->SetText(buf);
  359.  
  360.     // Set the points from the previous game to 0
  361.     //
  362.     pIdDispPPoints->SetText("0");
  363.     pIdDispDPoints->SetText("0");
  364.   }
  365.   else {
  366.     // Valid bet amount.
  367.     // Display and set bet amount.
  368.     //
  369.     pIdDispBet->SetText(buf);
  370.     bj.getPlayer(1)->getPocket().setTotal(money);
  371.  
  372.     // Enable "Stand" and "Hit" buttons
  373.     //
  374.     pStandBtn->EnableWindow(TRUE);
  375.     pHitBtn->EnableWindow(TRUE);
  376.     pHitBtn->SetFocus();
  377.  
  378.     // Enable "return" key to activate the "Hit" button.
  379.     //
  380.     SetDefaultId(pHitBtn->GetId());
  381.  
  382.     // Disable "Bet" and "Bankroll" button.
  383.     //
  384.     pBankrollBtn->EnableWindow(FALSE);
  385.     pBetBtn->EnableWindow     (FALSE);
  386.  
  387.     // For a new game get rid of the cards
  388.     // in dealers hand and players hand.
  389.     //
  390.     bj.getDealer().flushCards();
  391.     bj.getPlayer(1)->flushCards();
  392.  
  393.     // Dealer deals 2 cards to the player and displays
  394.     //
  395.     *bj.getPlayer(1) << bj.getDealer();
  396.     *bj.getPlayer(1) << bj.getDealer();
  397.  
  398.     // Display the dealt cards on players side.
  399.     //
  400.     *this << *bj.getPlayer(1);
  401.  
  402.     // Dealer deals a card to himself and displays.
  403.     //
  404.     bj.getDealer() << bj.getDealer();
  405.     *this << bj.getDealer();
  406.  
  407.     // Dealer deals another card to himself which is not displayed.
  408.     //
  409.     bj.getDealer() << bj.getDealer();
  410.  
  411.     // Check for Blackjack condition here.
  412.     //
  413.     if (bj.IsBlackjack())
  414.       gameOverCleanupBusted(bj.whoLost());
  415.   }
  416. }
  417.  
  418. //
  419. // This is the callback function for the "HIT" button.
  420. //
  421. void
  422. TBlackjack::IdHitBtn()
  423. {
  424.   *bj.getPlayer(1) << bj.getDealer();      //player gets a card.
  425.   int pPoint = bj.getPlayer(1)->getPoints();
  426.  
  427.   // Display the players card.
  428.   //
  429.   *this << *(bj.getPlayer(1));
  430.  
  431.   if (pPoint > 21)
  432.     gameOverCleanupBusted(PLAYER);
  433. }
  434.  
  435. //
  436. // This is the callback function for the "STAND" button.
  437. //
  438. void
  439. TBlackjack::IdStandBtn()
  440. {
  441.   int dPoint;
  442.   int pPoint;
  443.  
  444.   pPoint = bj.getPlayer(1)->getPoints();
  445.   dPoint = bj.getDealer().getPoints();
  446.   if (dPoint > pPoint) {
  447.     gameOverCleanupBusted(PLAYER);
  448.   }
  449.   else {
  450.     if (dPoint >= 17 && pPoint >= dPoint) {
  451.       // In this case the Dealer cannot draw any new
  452.       // cards, game is over, Dealer busted.
  453.       //
  454.       if (pPoint == dPoint)
  455.         gameOverCleanupBusted(BOTH);
  456.       else
  457.         gameOverCleanupBusted(DEALER);
  458.     }
  459.     else {
  460.       // Dealers algorithm for hit or stand.
  461.       //
  462.       int done = 0;
  463.       while (dPoint < 17 && !done) {
  464.         bj.getDealer() << bj.getDealer();
  465.         dPoint = bj.getDealer().getPoints();
  466.         if (dPoint > pPoint) {
  467.           if (dPoint > 21)
  468.             gameOverCleanupBusted(DEALER);
  469.           else
  470.             gameOverCleanupBusted(PLAYER);
  471.           done = 1;
  472.         }
  473.         if (!done && (dPoint == pPoint)) {
  474.           gameOverCleanupBusted(BOTH);
  475.           done = 1;
  476.         }
  477.         if (!done && dPoint < pPoint && dPoint >= 17) {
  478.           gameOverCleanupBusted(DEALER);
  479.           done = 1;
  480.         }
  481.       } // end while
  482.     }
  483.   }
  484. }
  485.  
  486. //
  487. // Input parameter is the person who got busted. Valid values are.
  488. // PLAYER 1
  489. // DEALER 2
  490. // BOTH   3
  491. // UNKNOWN 4
  492. //
  493. void
  494. TBlackjack::gameOverCleanupBusted(int who) throw(const char *)
  495. {
  496.   char buf[20];
  497.   if (who == UNKNOWN)
  498.     throw("gameOverCleanup():Input value Unknow.");
  499.  
  500.   // Put up the winning sign.
  501.  
  502.   if (who == DEALER) {
  503.     pIdDispBet->SetText("Player Won");
  504.     bj.getPlayer(1)->Won();
  505.     int t = bj.getPlayer(1)->getPocket().getTotal();
  506.     itoa(t, buf, 10);
  507.     pIdDispBankroll1->SetText(buf);
  508.   }
  509.  
  510.   if (who == PLAYER) {
  511.     pIdDispBet->SetText("Dealer Won");
  512.     bj.getPlayer(1)->Lost();
  513.     int t = bj.getPlayer(1)->getPocket().getTotal();
  514.     itoa(t, buf, 10);
  515.     pIdDispBankroll1->SetText(buf);
  516.   }
  517.  
  518.   if (who == BOTH) {
  519.     pIdDispBet->SetText("Draw");
  520.   }
  521.  
  522.   // Display all the Dealers card.
  523.   //
  524.   *this << bj.getDealer();
  525.  
  526.   // Check if the Bank roll is 0,
  527.   // Move focus to the Bankroll button in that case.
  528.   //
  529.   if (!bj.getPlayer(1)->getPocket().getTotal()) {
  530.     // Bankroll is 0 because you lost,
  531.     // time to put more money in the bankroll.
  532.     //
  533.     pIdDispBet->SetText("Enter Bankroll");
  534.  
  535.     pHitBtn->EnableWindow(FALSE);
  536.     pStandBtn->EnableWindow(FALSE);
  537.     pBetBtn->EnableWindow(FALSE);
  538.     pBankrollBtn->EnableWindow(TRUE);
  539.     pBankrollBtn->SetFocus();
  540.     // Enables "return" key to work on the "bankroll" button.
  541.     //
  542.     SetDefaultId(pBankrollBtn->GetId());
  543.   }
  544.   else {
  545.     // BankRoll is not 0 but it cannot be more
  546.     // than $9999, ie the limit.
  547.     // If it is above it then start a new game.
  548.     //
  549.     if (bj.getPlayer(1)->getPocket().getTotal() < 9999) {
  550.       pBankrollBtn->EnableWindow(FALSE);
  551.       pHitBtn->EnableWindow     (FALSE);
  552.       pStandBtn->EnableWindow   (FALSE);
  553.       pBetBtn->EnableWindow     (TRUE );
  554.       pBetBtn->SetFocus();
  555.       // Enables "return" key to work on the "Bet" button.
  556.       SetDefaultId(pBetBtn->GetId());
  557.     }
  558.     else {
  559.       // If bankroll is 9999 or more.
  560.       pIdDispBet->SetText("Max Bankroll !!!");
  561.  
  562.       pHitBtn->EnableWindow     (FALSE);
  563.       pStandBtn->EnableWindow   (FALSE);
  564.       pBetBtn->EnableWindow     (FALSE);
  565.       pBankrollBtn->EnableWindow(TRUE);
  566.       pBankrollBtn->SetFocus();
  567.       // Enables "return" key to work on the "Bankroll" button.
  568.       SetDefaultId(pBankrollBtn->GetId());
  569.     }
  570.   }
  571. }
  572.  
  573. void
  574. TBlackjack::CheckBankRollInput()
  575. {
  576.   // Enable bet button if valid input is present.
  577.   //
  578.   if (pEInputBankRoll->GetLineLength(0))
  579.     ::EnableWindow(GetDlgItem(ID_BET_BTN), TRUE);
  580.   else
  581.     ::EnableWindow(GetDlgItem(ID_BET_BTN), FALSE);
  582. }
  583. void
  584. TBlackjack::CheckBetInput()
  585. {
  586.   // Enable bet button if valid input is present.
  587.   if (pEInputBet->GetLineLength(1)) {
  588.     //It should display "Play" button
  589.     pBetBtn->SetWindowText("Pla&y");
  590.   }
  591.   else {
  592.     // Should display the "Bet" button.
  593.     pBetBtn->SetWindowText("&Bet");
  594.   }
  595. }
  596.  
  597. //------------------------------- operator << () ---------------------------
  598.  
  599. //
  600. // This is operator is used to display the cards on the table
  601. // for the dealer.
  602. //
  603. TBlackjack::operator << (Dealer &rhs)
  604. {
  605.   int total = rhs.getTotalCards();
  606.   for (int i = 0; i < total; i++) {
  607.     if (rhs.getCards()[i] != 0) {
  608.       if (!rhs.getCards()[i]->getVBXCard()) {
  609.         TVbxMhCardDeck * pCard = ppVBXCard[VBXCardCount];
  610.         pCard->SetPropSuit(ENUM(ConvToVBXSuite(rhs.getCards()[i]->getType())));
  611.  
  612.         // Make the card faceup.
  613.         //
  614.         pCard->SetPropValue(ENUM(ConvToVBXNum(rhs.getCards()[i]->getNumber())));
  615.  
  616.         // Shift by "half the card width" to right.
  617.         //
  618.         pCard->SetPropLeft(DEALER_VBX_CARD1_X+ (i*VBX_CARD_WIDTH*10));
  619.         pCard->SetPropTop (DEALER_VBX_CARD1_Y);
  620.         pCard->SetPropVisible(TRUE);
  621.  
  622.         // "VBXCardCount", points to the next VBX card which is
  623.         // available for display.
  624.         //
  625.         rhs.getCards()[i]->setVBXCard(VBXCardCount+1);
  626.         VBXCardCount++;
  627.       }
  628.     }
  629.   }
  630.  
  631.   // Set the points field of the dealer in TBlackjack dialog.
  632.   //
  633.   char points[10];
  634.   itoa(rhs.getPoints(), points, 10);
  635.   pIdDispDPoints->SetText(points);
  636.   return 1;
  637. }
  638.  
  639. //------------------------------- operator << () ---------------------------
  640.  
  641. //
  642. // This is operator is used to display the cards on the table
  643. // for the player.
  644. //
  645. TBlackjack::operator << (Player &rhs)
  646. {
  647.   int total = rhs.getTotalCards();
  648.   for (int i = 0; i < total; i++) {
  649.     if (rhs.getCards()[i] != 0) {
  650.       if (!rhs.getCards()[i]->getVBXCard()) {
  651.         TVbxMhCardDeck * pCard = ppVBXCard[VBXCardCount];
  652.         pCard->SetPropSuit(ENUM(ConvToVBXSuite(rhs.getCards()[i]->getType())));
  653.  
  654.         // Make the card faceup.
  655.         //
  656.         pCard->SetPropValue(ENUM(ConvToVBXNum(rhs.getCards()[i]->getNumber())));
  657.  
  658.         pCard->SetPropLeft(PLAYER_VBX_CARD1_X + i*VBX_CARD_WIDTH*10);
  659.         pCard->SetPropTop(PLAYER_VBX_CARD1_Y);
  660.  
  661.         pCard->SetPropVisible(TRUE);
  662.  
  663.         // VBXCardCount, keeps the card count on the actual VBX deck.
  664.         // count 12 menas 0-11 cards are already dealt.
  665.         // The cards always remain here only while displaying it
  666.         // displayed from here.
  667.         //
  668.         rhs.getCards()[i]->setVBXCard(VBXCardCount+1);
  669.         VBXCardCount++;
  670.       }
  671.     }
  672.   }
  673.  
  674.   // Set the points field of the dealer in TBlackjack dialog.
  675.   //
  676.   char points[10];
  677.   itoa(rhs.getPoints(), points, 10);
  678.   pIdDispPPoints->SetText(points);
  679.   return 1;
  680. }
  681.  
  682. //
  683. // Center the frame windows initial position here
  684. //
  685. void
  686. TBlackjackFrame::SetupWindow()
  687. {
  688.   TFrameWindow::SetupWindow();
  689.   BlackjackDialog = new TBlackjack(this);
  690.   SetClientWindow(BlackjackDialog);
  691.  
  692.   // Center the Frame window.
  693.   //
  694.   int x = ::GetSystemMetrics(SM_CXSCREEN);
  695.   int y = ::GetSystemMetrics(SM_CYSCREEN);
  696.   MoveWindow(
  697.         (x/2 - GetWindowRect().Width()/2),
  698.         (y < GetWindowRect().Height() ? 0: (y-GetWindowRect().Height())/2),
  699.         GetWindowRect().Width(), GetWindowRect().Height()
  700.         );
  701. }
  702.  
  703. void
  704. MovableDialog::SetupWindow()
  705. {
  706.   TDialog::SetupWindow();
  707.  
  708.   MoveWindow(
  709.       Parent->GetWindowRect().TopLeft().x+topLeftX,
  710.       Parent->GetWindowRect().TopLeft().y+topLeftY,
  711.       GetWindowRect().Width(), GetWindowRect().Height()
  712.     );
  713. }
  714.  
  715. DEFINE_RESPONSE_TABLE(TBlackjackApp)
  716.   EV_COMMAND(ID_ABOUT, IdAbout),
  717. END_RESPONSE_TABLE;
  718.  
  719. void
  720. TBlackjackApp::IdAbout()
  721. {
  722.   TDialog *pTDlg = new MovableDialog(0,0,MainWindow , AboutBox);
  723.   pTDlg->Execute();
  724. }
  725.  
  726. //
  727. // The card suite runs from 1-4
  728. // The VBX suite are enum-ed they have different values.
  729. //
  730. int
  731. ConvToVBXSuite(int cardSuite)
  732. {
  733.   return cardSuite - 1 + TVbxMhCardDeck::Suit_0_Clubs;
  734. }
  735.  
  736. //
  737. // The card numbers runs from 0(Ace)-13(Queen), this is for internal
  738. // representation nothing to do with Blackjack card points.
  739. // The VBX card numbers are enum-ed and they have different values.
  740. // it runs from (1-14), 0 is the back of the card.
  741. //
  742. int
  743. ConvToVBXNum(int cardNum)
  744. {
  745.   return cardNum + TVbxMhCardDeck::Value_1_Ace;
  746. }
  747.  
  748. //----------------------------------------------------------------------------
  749.  
  750. //
  751. // Create the BlackJack dialog as the application's main window.
  752. //
  753. void
  754. TBlackjackApp::InitMainWindow()
  755. {
  756.   EnableBWCC();
  757.  
  758.   TFrameWindow* frame = new TBlackjackFrame(0, "Turbo 21", 0, true);
  759.   frame->SetIcon(this, "BJ_ICO");
  760.   frame->AssignMenu("BJ_MENU");
  761.   frame->Attr.Style &= ~(WS_MAXIMIZEBOX | WS_THICKFRAME|WS_POPUP);
  762.  
  763.   SetMainWindow(frame);
  764. }
  765.  
  766. int
  767. OwlMain(int /*argc*/, char* /*argv*/ [])
  768. {
  769.   TBIVbxLibrary vbxLib;
  770.   try {
  771.     return TBlackjackApp(AppName).Run();
  772.   }
  773.   catch (const char *str) {
  774.     ::MessageBox(0, str, "Exception", MB_OK);
  775.   }
  776.   catch (...) {
  777.     ::MessageBox(0, "Exception Occured", "Generic Exception", MB_OK);
  778.   }
  779.   return -1;
  780. }
  781.